package fr.afcepf.ai89.esharing.metier;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

import javax.ejb.Stateless;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import fr.afcepf.ai89.esharing.data.IDAOAvis;
import fr.afcepf.ai89.esharing.data.IDAOEmprunt;
import fr.afcepf.ai89.esharing.data.IDAOMessagePrive;
import fr.afcepf.ai89.esharing.data.IDAOMouvementsSolde;
import fr.afcepf.ai89.esharing.data.IDAOSousAvis;
import fr.afcepf.ai89.esharing.data.IDAOValeur;
import fr.afcepf.ai89.esharing.entity.Aem;
import fr.afcepf.ai89.esharing.entity.Avis;
import fr.afcepf.ai89.esharing.entity.Emprunt;
import fr.afcepf.ai89.esharing.entity.MessagePrive;
import fr.afcepf.ai89.esharing.entity.MouvementsSolde;
import fr.afcepf.ai89.esharing.entity.Proprietaire;
import fr.afcepf.ai89.esharing.entity.SousAvis;
import fr.afcepf.ai89.esharing.entity.Valeur;

public class BusinessEmpruntAem implements IBusinessEmpruntAem {

	@Override
	public int demanderEmprunt(Emprunt emprunt) {
		
		int id = 0;
		
		try {
			
			Context ctx;
			ctx = new InitialContext();
			IDAOEmprunt proxyDataEmprunt = null;
			IDAOMouvementsSolde proxyMouvSolde = null;
			IDAOValeur proxyValeur = null;
			
			try {
				
				proxyDataEmprunt = (IDAOEmprunt)ctx.lookup("java:global/ESharingPhase1/DAOEmprunt!fr.afcepf.ai89.esharing.data.IDAOEmprunt");
				proxyMouvSolde = (IDAOMouvementsSolde)ctx.lookup("java:global/ESharingPhase1/DAOMouvementsSolde!fr.afcepf.ai89.esharing.data.IDAOMouvementsSolde");
				proxyValeur = (IDAOValeur)ctx.lookup("java:global/ESharingPhase1/DAOValeur!fr.afcepf.ai89.esharing.data.IDAOValeur");
			
			}
			catch (Exception e ) {
				
				proxyDataEmprunt = (IDAOEmprunt)ctx.lookup("ESharingPhase1/DAOEmprunt!fr.afcepf.ai89.esharing.data.IDAOEmprunt");
				proxyMouvSolde = (IDAOMouvementsSolde)ctx.lookup("ESharingPhase1/DAOMouvementsSolde!fr.afcepf.ai89.esharing.data.IDAOMouvementsSolde");
				proxyValeur = (IDAOValeur)ctx.lookup("ESharingPhase1/DAOValeur!fr.afcepf.ai89.esharing.data.IDAOValeur");
			
			}
			
			id = proxyDataEmprunt.demanderEmprunt(emprunt);
			
			// Débiter l'emprunteur pour la totalité de l'emprunt demandé :
			
			MouvementsSolde debitEmp = new MouvementsSolde();
			
				TimeUnit lesDays = TimeUnit.DAYS;
					long diffInMillies = emprunt.getDateFin().getTime() - emprunt.getDateDebut().getTime();
					double daysEmprunt = lesDays.convert(diffInMillies, lesDays);
				
				 List<Valeur> lesAem = proxyValeur.getValeurs(emprunt.getAem());
				 
				 	double lePrix = 0;
				 	
				 	if (lesAem.size() > 0) {
				 		
				 		lePrix = lesAem.get(lesAem.size() - 1).getValeurJournaliere().doubleValue();
				 		
				 	}
				 	
				 double montantDu = lePrix * daysEmprunt;
				 
				 debitEmp.setProprietaire(emprunt.getProprietaire());
				 debitEmp.setMontantCredit(new BigDecimal(0));
				 debitEmp.setMontantDebit(new BigDecimal(montantDu));
			
			proxyMouvSolde.transagir(debitEmp);
		
		}
		catch (NamingException e) {
			
			e.printStackTrace();
			
		}
		
		return id;

	}

	@Override
	public int annulerEmprunt(Emprunt emprunt) {
		
		int id = 0;
		
		try {
			
			Context ctx;
			ctx = new InitialContext();
			IDAOEmprunt proxyDataEmprunt = null;
			IDAOMouvementsSolde proxyMouvSolde = null;
			IDAOValeur proxyValeur = null;
			
			try {
				
				proxyDataEmprunt = (IDAOEmprunt)ctx.lookup("java:global/ESharingPhase1/DAOEmprunt!fr.afcepf.ai89.esharing.data.IDAOEmprunt");
				proxyMouvSolde = (IDAOMouvementsSolde)ctx.lookup("java:global/ESharingPhase1/DAOMouvementsSolde!fr.afcepf.ai89.esharing.data.IDAOMouvementsSolde");
				proxyValeur = (IDAOValeur)ctx.lookup("java:global/ESharingPhase1/DAOValeur!fr.afcepf.ai89.esharing.data.IDAOValeur");
			
			}
			catch (Exception e ) {
				
				proxyDataEmprunt = (IDAOEmprunt)ctx.lookup("ESharingPhase1/DAOEmprunt!fr.afcepf.ai89.esharing.data.IDAOEmprunt");
				proxyMouvSolde = (IDAOMouvementsSolde)ctx.lookup("ESharingPhase1/DAOMouvementsSolde!fr.afcepf.ai89.esharing.data.IDAOMouvementsSolde");
				proxyValeur = (IDAOValeur)ctx.lookup("ESharingPhase1/DAOValeur!fr.afcepf.ai89.esharing.data.IDAOValeur");
			
			}
			
			id = proxyDataEmprunt.annulerEmprunt(emprunt);
				
			// Créditer l'emprunteur pour la totalité de l'emprunt annulé :
			
			MouvementsSolde debitEmp = new MouvementsSolde();
			
				TimeUnit lesDays = TimeUnit.DAYS;
					long diffInMillies = emprunt.getDateFin().getTime() - emprunt.getDateDebut().getTime();
					double daysEmprunt = lesDays.convert(diffInMillies, lesDays);
				
				 List<Valeur> lesAem = proxyValeur.getValeurs(emprunt.getAem());
				 
				 	double lePrix = 0;
				 	
				 	if (lesAem.size() > 0) {
				 		
				 		lePrix = lesAem.get(lesAem.size() - 1).getValeurJournaliere().doubleValue();
				 		
				 	}
				 	
				 double montantDu = lePrix * daysEmprunt;
				 
				 debitEmp.setProprietaire(emprunt.getProprietaire());
				 debitEmp.setMontantDebit(new BigDecimal(montantDu));
				 debitEmp.setMontantCredit(new BigDecimal(0));
			
			proxyMouvSolde.transagir(debitEmp);
	
		}
		catch (NamingException e) {
			
			e.printStackTrace();
			
		}
		
		return id;

	}

	@Override
	public int majEmprunt(Emprunt emprunt) {

		int id = 0;
		
		try {
			
			Context ctx;
			ctx = new InitialContext();
			IDAOEmprunt proxyDataEmprunt = null;
			IDAOMouvementsSolde proxyMouvSolde = null;
			IDAOValeur proxyValeur = null;
			
			try {
				
				proxyDataEmprunt = (IDAOEmprunt)ctx.lookup("java:global/ESharingPhase1/DAOEmprunt!fr.afcepf.ai89.esharing.data.IDAOEmprunt");
				proxyMouvSolde = (IDAOMouvementsSolde)ctx.lookup("java:global/ESharingPhase1/DAOMouvementsSolde!fr.afcepf.ai89.esharing.data.IDAOMouvementsSolde");
				proxyValeur = (IDAOValeur)ctx.lookup("java:global/ESharingPhase1/DAOValeur!fr.afcepf.ai89.esharing.data.IDAOValeur");
			
			}
			catch (Exception e ) {
				
				proxyDataEmprunt = (IDAOEmprunt)ctx.lookup("ESharingPhase1/DAOEmprunt!fr.afcepf.ai89.esharing.data.IDAOEmprunt");
				proxyMouvSolde = (IDAOMouvementsSolde)ctx.lookup("ESharingPhase1/DAOMouvementsSolde!fr.afcepf.ai89.esharing.data.IDAOMouvementsSolde");
				proxyValeur = (IDAOValeur)ctx.lookup("ESharingPhase1/DAOValeur!fr.afcepf.ai89.esharing.data.IDAOValeur");
			
			}
			
			Emprunt ancienEmp = proxyDataEmprunt.getEmprunt(emprunt.getIdEmprunt());
			
			// Ajuster le montant du débit pour l'emprunt modifier. En réalité :
			// 1. Créditer l'emprunteur pour la totalité du montant ancien ;
			// 2. Débiter l'emprunteur pour la totalité du montant mis 
			
			
			id = proxyDataEmprunt.majEmprunt(emprunt);
				
		}
		catch (NamingException e) {
			
			e.printStackTrace();
			
		}
		
		return id;

	}

	@Override
	public int addAvisSurPreteur(Emprunt emprunt) {

		// May need to add avis and sous-avis to arguments
		int id = 0;
		
		try {
			
			Context ctx;
			ctx = new InitialContext();
			IDAOAvis proxyDataAvis = null;
			IDAOSousAvis proxyDataSousAvis = null;
			IDAOEmprunt proxyDataEmprunt = null;
			
			try {
				
				proxyDataAvis = (IDAOAvis)ctx.lookup("java:global/ESharingPhase1/DAOAvis!fr.afcepf.ai89.esharing.data.IDAOAvis");
			
			}
			catch (Exception e ) {
				
				proxyDataAvis = (IDAOAvis)ctx.lookup("ESharingPhase1/DAOAvis!fr.afcepf.ai89.esharing.data.IDAOAvis");
			
			}
			
			try {
				
				proxyDataSousAvis = (IDAOSousAvis)ctx.lookup("java:global/ESharingPhase1/DAOSousAvis!fr.afcepf.ai89.esharing.data.IDAOSousAvis");
			
			}
			catch (Exception e ) {
				
				proxyDataSousAvis = (IDAOSousAvis)ctx.lookup("ESharingPhase1/DAOSousAvis!fr.afcepf.ai89.esharing.data.IDAOSousAvis");
			
			}
			
			try {
				
				proxyDataEmprunt = (IDAOEmprunt)ctx.lookup("java:global/ESharingPhase1/DAOEmprunt!fr.afcepf.ai89.esharing.data.IDAOEmprunt");
			
			}
			catch (Exception e ) {
				
				proxyDataEmprunt = (IDAOEmprunt)ctx.lookup("ESharingPhase1/DAOEmprunt!fr.afcepf.ai89.esharing.data.IDAOEmprunt");
			
			}
			
			int idAv = proxyDataAvis.addAvis(emprunt.getAvisSurPreteur());
			Avis nouveauAvis = proxyDataAvis.getAvis(idAv);
			nouveauAvis.setSousAvis(emprunt.getAvisSurPreteur().getSousAvis());
			
			List<SousAvis> lesSA = new ArrayList<SousAvis>();
			
			for (SousAvis sa : nouveauAvis.getSousAvis()) {
				
				sa.setAvis(nouveauAvis);
				int idSA = proxyDataSousAvis.addSousAvis(sa);
				lesSA.add(proxyDataSousAvis.getSousAvis(idSA));
				
			}
			
			nouveauAvis.setSousAvis(lesSA);
			emprunt.setAvisSurPreteur(nouveauAvis);
			
			id = proxyDataEmprunt.laisserAvisSurPreteur(emprunt);
				
		}
		catch (NamingException e) {
			
			e.printStackTrace();
			
		}
		
		return id;

	}

	@Override
	public List<Emprunt> creerPanier(Emprunt premierEmprunt) {
		
		List<Emprunt> monPanier = new ArrayList<Emprunt>();
		monPanier.add(premierEmprunt);
		
		return monPanier;
		
	}

	@Override
	public void validerPanier(List<Emprunt> monPanier) {
		
		for (Emprunt emp : monPanier) {
			
			this.demanderEmprunt(emp);
			
		}

	}

	@Override
	public List<Emprunt> getEmpruntsPasses(Proprietaire prop) {
		
		List<Emprunt> mesEmprunts = new ArrayList<Emprunt>();
		
		try {
			
			Context ctx;
			ctx = new InitialContext();
			IDAOEmprunt proxyDataEmprunt = null;
			
			try {
				
				proxyDataEmprunt = (IDAOEmprunt)ctx.lookup("java:global/ESharingPhase1/DAOEmprunt!fr.afcepf.ai89.esharing.data.IDAOEmprunt");
			
			}
			catch (Exception e ) {
				
				proxyDataEmprunt = (IDAOEmprunt)ctx.lookup("ESharingPhase1/DAOEmprunt!fr.afcepf.ai89.esharing.data.IDAOEmprunt");
			
			}
			
			mesEmprunts = proxyDataEmprunt.getEmpruntsPasses(prop);
				
		}
		catch (NamingException e) {
			
			e.printStackTrace();
			
		}
		
		return mesEmprunts;

	}

	@Override
	public List<Emprunt> getEmpruntsEnCours(Proprietaire prop) {
		
		List<Emprunt> mesEmprunts = new ArrayList<Emprunt>();
		
		try {
			
			Context ctx;
			ctx = new InitialContext();
			IDAOEmprunt proxyDataEmprunt = null;
			
			try {
				
				proxyDataEmprunt = (IDAOEmprunt)ctx.lookup("java:global/ESharingPhase1/DAOEmprunt!fr.afcepf.ai89.esharing.data.IDAOEmprunt");
			
			}
			catch (Exception e ) {
				
				proxyDataEmprunt = (IDAOEmprunt)ctx.lookup("ESharingPhase1/DAOEmprunt!fr.afcepf.ai89.esharing.data.IDAOEmprunt");
			
			}
			
			mesEmprunts = proxyDataEmprunt.getEmpruntsEnCours(prop);
				
		}
		catch (NamingException e) {
			
			e.printStackTrace();
			
		}
		
		return mesEmprunts;

	}

	@Override
	public List<Emprunt> getEmpruntsPlannifies(Proprietaire prop) {
		
		List<Emprunt> mesEmprunts = new ArrayList<Emprunt>();
		
		try {
			
			Context ctx;
			ctx = new InitialContext();
			IDAOEmprunt proxyDataEmprunt = null;
			
			try {
				
				proxyDataEmprunt = (IDAOEmprunt)ctx.lookup("java:global/ESharingPhase1/DAOEmprunt!fr.afcepf.ai89.esharing.data.IDAOEmprunt");
			
			}
			catch (Exception e ) {
				
				proxyDataEmprunt = (IDAOEmprunt)ctx.lookup("ESharingPhase1/DAOEmprunt!fr.afcepf.ai89.esharing.data.IDAOEmprunt");
			
			}
			
			mesEmprunts = proxyDataEmprunt.getEmpruntsPlannifies(prop);
				
		}
		catch (NamingException e) {
			
			e.printStackTrace();
			
		}
		
		return mesEmprunts;
		
	}

	@Override
	public List<Emprunt> getEmpruntsNonValides(Proprietaire prop) {

		List<Emprunt> mesEmprunts = new ArrayList<Emprunt>();
		
		try {
			
			Context ctx;
			ctx = new InitialContext();
			IDAOEmprunt proxyDataEmprunt = null;
			
			try {
				
				proxyDataEmprunt = (IDAOEmprunt)ctx.lookup("java:global/ESharingPhase1/DAOEmprunt!fr.afcepf.ai89.esharing.data.IDAOEmprunt");
			
			}
			catch (Exception e ) {
				
				proxyDataEmprunt = (IDAOEmprunt)ctx.lookup("ESharingPhase1/DAOEmprunt!fr.afcepf.ai89.esharing.data.IDAOEmprunt");
			
			}
			
			mesEmprunts = proxyDataEmprunt.getEmpruntsNonValides(prop);
				
		}
		catch (NamingException e) {
			
			e.printStackTrace();
			
		}
		
		return mesEmprunts;

	}

	@Override
	public List<Emprunt> getEmprunts() {
		
		List<Emprunt> mesEmprunts = new ArrayList<Emprunt>();
		
		try {
			
			Context ctx;
			ctx = new InitialContext();
			IDAOEmprunt proxyDataEmprunt = null;
			
			try {
				
				proxyDataEmprunt = (IDAOEmprunt)ctx.lookup("java:global/ESharingPhase1/DAOEmprunt!fr.afcepf.ai89.esharing.data.IDAOEmprunt");
			
			}
			catch (Exception e ) {
				
				proxyDataEmprunt = (IDAOEmprunt)ctx.lookup("ESharingPhase1/DAOEmprunt!fr.afcepf.ai89.esharing.data.IDAOEmprunt");
			
			}
			
			mesEmprunts = proxyDataEmprunt.getEmprunts();
				
		}
		catch (NamingException e) {
			
			e.printStackTrace();
			
		}
		
		return mesEmprunts;
				
	}

	@Override
	public Double afficherSolde(Proprietaire prop) {
		
		List<MouvementsSolde> mesTransactions = new ArrayList<MouvementsSolde>();
		
		try {
			
			Context ctx;
			ctx = new InitialContext();
			IDAOMouvementsSolde proxyDataMouvSolde = null;
			
			try {
				
				proxyDataMouvSolde = (IDAOMouvementsSolde)ctx.lookup("java:global/ESharingPhase1/DAOMouvementsSolde!fr.afcepf.ai89.esharing.data.IDAOMouvementsSolde");
			
			}
			catch (Exception e ) {
				
				proxyDataMouvSolde = (IDAOMouvementsSolde)ctx.lookup("ESharingPhase1/DAOMouvementsSolde!fr.afcepf.ai89.esharing.data.IDAOMouvementsSolde");
			
			}
			
			mesTransactions = proxyDataMouvSolde.getMouvsSolde(prop);
				
		}
		catch (NamingException e) {
			
			e.printStackTrace();
			
		}
		
		BigDecimal sum = new BigDecimal(0);
		
		for (MouvementsSolde m : mesTransactions) {
			
			sum = sum.add(m.getMontantCredit());
			sum = sum.subtract(m.getMontantDebit());
						
		}
		
		Double somme = 100 + sum.doubleValue();
		
		return somme;

	}

	@Override
	public Emprunt getEmprunt(int idEmprunt) {

		Emprunt emp = new Emprunt();
		
		try {
			
			Context ctx;
			ctx = new InitialContext();
			IDAOEmprunt proxyDataEmprunt = null;
			
			try {
				
				proxyDataEmprunt = (IDAOEmprunt)ctx.lookup("java:global/ESharingPhase1/DAOEmprunt!fr.afcepf.ai89.esharing.data.IDAOEmprunt");
			
			}
			catch (Exception e ) {
				
				proxyDataEmprunt = (IDAOEmprunt)ctx.lookup("ESharingPhase1/DAOEmprunt!fr.afcepf.ai89.esharing.data.IDAOEmprunt");
			
			}
			
			emp = proxyDataEmprunt.getEmprunt(idEmprunt);
				
		}
		catch (NamingException e) {
			
			e.printStackTrace();
			
		}
		
		return emp;

	}

	@Override
	public List<Emprunt> getEmpruntsAnnules(Proprietaire prop) {
		
		List<Emprunt> mesEmprunts = new ArrayList<Emprunt>();
		
		try {
			
			Context ctx;
			ctx = new InitialContext();
			IDAOEmprunt proxyDataEmprunt = null;
			
			try {
				
				proxyDataEmprunt = (IDAOEmprunt)ctx.lookup("java:global/ESharingPhase1/DAOEmprunt!fr.afcepf.ai89.esharing.data.IDAOEmprunt");
			
			}
			catch (Exception e ) {
				
				proxyDataEmprunt = (IDAOEmprunt)ctx.lookup("ESharingPhase1/DAOEmprunt!fr.afcepf.ai89.esharing.data.IDAOEmprunt");
			
			}
			
			mesEmprunts = proxyDataEmprunt.getEmpruntsAnnules(prop);
			//System.out.println("##########################################################");
			//System.out.println("##########################################################");
			//System.out.println(proxyDataEmprunt);
			//System.out.println(mesEmprunts);
			//System.out.println("##########################################################");
			//System.out.println("##########################################################");
			
		}
		catch (NamingException e) {
			
			e.printStackTrace();
			
		}
		
		return mesEmprunts;
		
	}

	@Override
	public List<Emprunt> getEmpruntsRefuses(Proprietaire prop) {

		List<Emprunt> mesEmprunts = new ArrayList<Emprunt>();
		
		try {
			
			Context ctx;
			ctx = new InitialContext();
			IDAOEmprunt proxyDataEmprunt = null;
			
			try {
				
				proxyDataEmprunt = (IDAOEmprunt)ctx.lookup("java:global/ESharingPhase1/DAOEmprunt!fr.afcepf.ai89.esharing.data.IDAOEmprunt");
			
			}
			catch (Exception e ) {
				
				proxyDataEmprunt = (IDAOEmprunt)ctx.lookup("ESharingPhase1/DAOEmprunt!fr.afcepf.ai89.esharing.data.IDAOEmprunt");
			
			}
			
			mesEmprunts = proxyDataEmprunt.getEmpruntsRefuses(prop);
				
		}
		catch (NamingException e) {
			
			e.printStackTrace();
			
		}
		
		return mesEmprunts;

	}

	@Override
	public List<Emprunt> getEmprunts(Proprietaire prop) {

		List<Emprunt> mesEmprunts = new ArrayList<Emprunt>();
		
		try {
			
			Context ctx;
			ctx = new InitialContext();
			IDAOEmprunt proxyDataEmprunt = null;
			
			try {
				
				proxyDataEmprunt = (IDAOEmprunt)ctx.lookup("java:global/ESharingPhase1/DAOEmprunt!fr.afcepf.ai89.esharing.data.IDAOEmprunt");
			
			}
			catch (Exception e ) {
				
				proxyDataEmprunt = (IDAOEmprunt)ctx.lookup("ESharingPhase1/DAOEmprunt!fr.afcepf.ai89.esharing.data.IDAOEmprunt");
			
			}
			
			mesEmprunts = proxyDataEmprunt.getEmprunts(prop);
				
		}
		catch (NamingException e) {
			
			e.printStackTrace();
			
		}
		
		return mesEmprunts;

	}

	@Override
	public List<Emprunt> getEmprunts(Aem aem) {

		List<Emprunt> mesEmprunts = new ArrayList<Emprunt>();
		
		try {
			
			Context ctx;
			ctx = new InitialContext();
			IDAOEmprunt proxyDataEmprunt = null;
			
			try {
				
				proxyDataEmprunt = (IDAOEmprunt)ctx.lookup("java:global/ESharingPhase1/DAOEmprunt!fr.afcepf.ai89.esharing.data.IDAOEmprunt");
			
			}
			catch (Exception e ) {
				
				proxyDataEmprunt = (IDAOEmprunt)ctx.lookup("ESharingPhase1/DAOEmprunt!fr.afcepf.ai89.esharing.data.IDAOEmprunt");
			
			}
			
			mesEmprunts = proxyDataEmprunt.getEmprunts(aem);
				
		}
		catch (NamingException e) {
			
			e.printStackTrace();
			
		}
		
		return mesEmprunts;

	}

}
